package com.sky.controller.admin;

import com.sky.constant.JwtClaimsConstant;
import com.sky.constant.PasswordConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.BaseContext;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.dto.PasswordEditDTO;
import com.sky.entity.Employee;
import com.sky.properties.JwtProperties;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.EmployeeService;
import com.sky.utils.JwtUtil;
import com.sky.vo.EmployeeLoginVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 员工管理
 */
@RestController
@RequestMapping("/admin/employee")
@Slf4j
@Api(tags = "员工相关接口")
public class EmployeeController {

	@Autowired
	private EmployeeService employeeService;
	@Autowired
	private JwtProperties jwtProperties;

	/**
	 * 登录
	 *
	 * @param employeeLoginDTO
	 */
	@PostMapping("/login")
	@ApiOperation("员工登录")
	public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO) {

		log.info("* 用户名为{}的用户尝试登录系统", employeeLoginDTO.getUsername());
		Employee employee = employeeService.login(employeeLoginDTO);
		log.info("* {} 登录成功系统,他的id为 {}", employee.getName(), employee.getId());

		//登录成功后，生成jwt令牌
		Map<String, Object> claims = new HashMap<>();
		claims.put(JwtClaimsConstant.EMP_ID, employee.getId());
		String token = JwtUtil.createJWT(
				jwtProperties.getAdminSecretKey(),
				jwtProperties.getAdminTtl(),
				claims);

		EmployeeLoginVO employeeLoginVO = EmployeeLoginVO.builder()
				.id(employee.getId())
				.userName(employee.getUsername())
				.name(employee.getName())
				.token(token)
				.build();

		return Result.success(employeeLoginVO);
	}

	/**
	 * 退出
	 */
	@ApiOperation("员工退出")
	@PostMapping("/logout")
	public Result<String> logout() {
		log.info("员工退出！");
		return Result.success();
	}


	@PostMapping
	@ApiOperation("新增员工")
	public Result save(@RequestBody EmployeeDTO employeeDTO) {
		log.info("新增员工:{}", employeeDTO);
		employeeService.save(employeeDTO);
		return Result.success();
	}

	@GetMapping("/page")
	@ApiOperation("员工分页查询")
	public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO) {
		log.info("员工分页查询，参数是：{}", employeePageQueryDTO);
		PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO);
		return Result.success(pageResult);

	}

	@PostMapping("/status/{status}")
	@ApiOperation("启用禁用员工账户")
	public Result startOrStop(@PathVariable("status") Integer status, Long id) {
		if (StatusConstant.ENABLE.equals(status)) {
			log.info("启用id为：{} 的员工账号", id);
		} else {
			log.info("禁用id为：{} 的员工账号", id);
		}
		employeeService.startOrStop(status, id);
		return Result.success();
	}

	@GetMapping("/{id}")
	@ApiOperation("根据id查询员工信息")
	public Result<Employee> getById(@PathVariable Long id) {
		log.info("正在查询id为:{} 的员工信息", id);
		Employee employee = employeeService.getById(id);
		return Result.success(employee);
	}

	@PutMapping()
	@ApiOperation("编辑员工信息")
	public Result update(@RequestBody EmployeeDTO employeeDTO) {
		log.info("修改id为:{} 的信息为:{}", employeeDTO.getId(), employeeDTO);
		employeeService.update(employeeDTO);
		return Result.success();
	}

	@PutMapping("/editPassword")
	@ApiOperation("修改密码")
	public Result editPassword(@RequestBody PasswordEditDTO passwordEditDTO) {
		Long empId = (Long) BaseContext.get(JwtClaimsConstant.EMP_ID);
		log.info("id为{}的员工修改密码",empId);
		passwordEditDTO.setEmpId(empId);
		employeeService.editPassword(passwordEditDTO);
		return Result.success();
	}

}
